home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / selectfile.c < prev    next >
C/C++ Source or Header  |  2004-02-05  |  3KB  |  112 lines

  1. /*-------------------------------------------------------------
  2.   fileselect.c : open dialog boxes to select file / folder
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10. #include <shlobj.h>
  11.  
  12. #ifndef BIF_NEWDIALOGSTYLE
  13. #define BIF_NEWDIALOGSTYLE     0x0040
  14. #endif
  15.  
  16. /* Globals */
  17.  
  18. BOOL SelectMyFile(HINSTANCE hInst, HWND hDlg,
  19.     const char *filter, DWORD nFilterIndex,
  20.     const char *deffile, char *retfile);
  21. BOOL SelectFolder(HWND hDlg, const char *def, char *ret);
  22.  
  23. /* Statics */
  24.  
  25. static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg,
  26.     LPARAM lParam, LPARAM lpData);
  27.  
  28. /*------------------------------------------------
  29.    select file
  30. --------------------------------------------------*/
  31. BOOL SelectMyFile(HINSTANCE hInst, HWND hDlg,
  32.     const char *filter, DWORD nFilterIndex,
  33.     const char *deffile, char *retfile)
  34. {
  35.     OPENFILENAME ofn;
  36.     char fname[MAX_PATH], ftitle[MAX_PATH], initdir[MAX_PATH];
  37.     BOOL r;
  38.     
  39.     memset(&ofn, '\0', sizeof(OPENFILENAME));
  40.     
  41.     GetModuleFileName(hInst, initdir, MAX_PATH);
  42.     del_title(initdir);
  43.     if(deffile[0])
  44.     {
  45.         WIN32_FIND_DATA fd;
  46.         HANDLE hfind;
  47.         hfind = FindFirstFile(deffile, &fd);
  48.         if(hfind != INVALID_HANDLE_VALUE)
  49.         {
  50.             FindClose(hfind);
  51.             strcpy(initdir, deffile);
  52.             del_title(initdir);
  53.         }
  54.     }
  55.     
  56.     fname[0] = 0;
  57.     ofn.lStructSize = sizeof(OPENFILENAME);
  58.     ofn.hwndOwner = hDlg;
  59.     ofn.hInstance = hInst;
  60.     ofn.lpstrFilter = filter;
  61.     ofn.nFilterIndex = nFilterIndex;
  62.     ofn.lpstrFile= fname;
  63.     ofn.nMaxFile = MAX_PATH;
  64.     ofn.lpstrFileTitle = ftitle;
  65.     ofn.nMaxFileTitle = MAX_PATH;
  66.     ofn.lpstrInitialDir = initdir;
  67.     ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST;
  68.     // ofn.FlagsEx = 0;
  69.     
  70.     r = GetOpenFileName(&ofn);
  71.     if(!r) return r;
  72.     
  73.     strcpy(retfile, ofn.lpstrFile);
  74.     
  75.     return r;
  76. }
  77.  
  78. /*------------------------------------------------
  79.    select folder
  80. --------------------------------------------------*/
  81. BOOL SelectFolder(HWND hDlg, const char *def, char *ret)
  82. {
  83.     BROWSEINFO bi;
  84.     LPITEMIDLIST pidl;
  85.     
  86.     memset(&bi, 0, sizeof(BROWSEINFO));
  87.     bi.hwndOwner = hDlg;
  88.     bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
  89.     bi.lpfn = (BFFCALLBACK)BrowseCallbackProc;
  90.     bi.lParam = (LPARAM)def;
  91.     pidl = SHBrowseForFolder(&bi);
  92.     if(!pidl) return FALSE;
  93.     
  94.     SHGetPathFromIDList(pidl, ret);
  95.     return TRUE;
  96. }
  97.  
  98. /*------------------------------------------
  99.   callback procedure: select default folder
  100. --------------------------------------------*/
  101. int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg,
  102.     LPARAM lParam, LPARAM lpData)
  103. {
  104.     if(uMsg == BFFM_INITIALIZED)
  105.     {
  106.         if(lpData && *(char *)lpData)
  107.             SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData);
  108.     }
  109.     return 0;
  110. }
  111.  
  112.